package web

import (
	"a-admin/web/middleware"
	"a-admin/web/router"
	"a-common/config"
	"a-common/myerr"
	"fmt"

	"github.com/gofiber/fiber/v2"
	"github.com/gofiber/fiber/v2/middleware/cors"
	"github.com/gofiber/fiber/v2/middleware/logger"
	"github.com/gofiber/fiber/v2/middleware/recover"
)

func Start() {
	conf := config.Config

	app := fiber.New(fiber.Config{
		// Prefork:       true, // 多线程
		CaseSensitive: true,
		StrictRouting: true,
		ServerHeader:  conf.App.Introduction,
		AppName:       conf.App.Name,
	})
	// ! 接口限流，请请勿在访问频繁的接口上设置,暂时注释该配置
	// app.Use(limiter.New())
	// 是否打印请求日志
	app.Use(logger.New())
	// 跨域 CORS for external resources
	app.Use(cors.New())

	// 认证
	app.Use(middleware.AuthHandler())

	// 统一异常处理
	app.Use(middleware.ErrorHandler())

	// 故障恢复
	app.Use(recover.New())

	baseUrl := config.Config.Server.BaseUrl
	baseRoute := app.Group(baseUrl)
	// 注册路由信息
	initRoutes(baseRoute)

	// Last middleware to match anything
	app.Use(func(c *fiber.Ctx) error {
		return myerr.ERR_SYS_404
	})
	err := app.Listen(conf.Server.Port)
	if err != nil {
		fmt.Println("Error starting server:", err.Error())
		return
	}
}

// 初始化路由
func initRoutes(r fiber.Router) {
	// 登陆管理
	router.InitSysLoginRoutes(r)
	// 用户管理
	router.InitSysUserRoutes(r)
	// 角色管理
	router.InitSysRoleRoutes(r)
	// 权限管理
	router.InitSysMenuRoutes(r)
	// 岗位管理
	router.InitSysPostRoutes(r)
	// 部门管理
	router.InitSysDeptRoutes(r)
	// 通知管理
	router.InitSysNoticeRoutes(r)
	// 登陆日志
	router.InitSysLogininforRoutes(r)
	// 操作日志
	router.InitSysOperlogRoutes(r)
	// 公共服务
	router.InitSysCommRoutes(r)
	// 即时通讯
	router.InitWebsoketRoutes(r)

	// APP 移动端接口
	router.InitAppApiRoutes(r)
	// APP 用户管理
	router.InitAppUserRoutes(r)

	// PAY 支付回调
	router.InitPayRoutes(r)
	// PAY 支付记录
	router.InitPayRecordRoutes(r)
}
